home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / bastips2.arc / BASCMATH.TXT < prev    next >
Text File  |  1988-11-29  |  5KB  |  117 lines

  1.                 Converting Decimals to Fractions
  2.             (BYTE Magazine May 1985 by Dan Sandberg)
  3.  
  4.      If you needed the solution of 11/17 + 13/19 - 139/323 - 37/15 +
  5. 47/21 in fractional form, finding the lowest common denominator might
  6. be difficult.  Instead, you can plug the decimal equivalent,
  7. 0.672357364 into the following program and obtain a solution of
  8. 7601/11305.
  9.      The program can help you factor 133133/1101373 to 11/91 or
  10. verify that sine 60 degrees equals the square root of 3 divided by 2.
  11.      Program one, which returns a fraction for every decimal input,
  12. uses a short algorithm.  First, the program inverts the decimal to
  13. obtain a number greater than 1.  The routine saves the integer and
  14. again inverts the decimal remainder.  So it continues, until the
  15. algorithm finds a denominator that supports an integer numerator.
  16.      If you want fractions printed in mixed form, add:
  17.  
  18. 35 IF INT(A)>0 THEN PRINT INT(A);"+";C*(A-INT(A));'/';C
  19.  
  20. Program One:
  21.  
  22. 10 INPUT A:B=0:C=1:D=ABS(A-INT(A))
  23. 20 IF D=0 THEN 40
  24. 30 E=1/D:F=C:C=INT(E)*C+B:B=F:D=E-INT(E):IF A*C<>INT(A*C) THEN 30
  25. 40 PRINT A*C;"/";C:GOTO 10
  26.  
  27.      Program two is shorter and faster, but it may require higher
  28. calculating precision.  It never returns an inexact (even if close)
  29. fraction; it returns an error if you input insufficient precision.
  30. The program inverts the incoming number with a special algorithm until
  31. it finds the denominator.  If the fraction is too difficult (i.e.,
  32. requiring greater precision), an overflow error will occur.  If you
  33. enter too few decimal digits, the program, which does not round A*B
  34. to an integer, will warn you by writing a decimal numerator that is
  35. close to an integer.  With a precision of 12 digits, 0.333333333333
  36. will generate the answer 1/3.  However, 0.3333333333 will yield
  37. 0.9999999999/3.  On the other hand, 0.333 gives the answer 333/1000,
  38. a useful feature for those needing precise fractions.  Others might
  39. round A*B to the nearest integer.  The constant, 0.00001, in line
  40. 110 is suitable for 12-digit calculating precision.  Try constants
  41. like 0.0001 and 0,000001 to produce the best possible conversion
  42. capability.  For mixed output, you can add:
  43.  
  44. 130 PRINT INT(A);"+";(A-INT(A))*B;"/";B
  45.  
  46. Program Two:
  47.  
  48. 100 INPUT A:C=ABS(A):B=1
  49. 110 B=B/C:C=(1/C)-INT(1/C):IF C>0.00001 THEN 110
  50. 120 B=INT(B):PRINT A*B;"/";B:GOTO 100
  51.  
  52.      Program three detects constants like pi, the square root of 2,
  53. and square root of 3; enter the sine 60 degrees (0.8660254) and get
  54. the square root of 3 divided by 2.  The program divides and multiplies
  55. the incoming decimals by the constants, one at a time, and uses a
  56. slightly modified version of program two as a subroutine to determine
  57. whether the constants form part of the fraction. The decimal equivalent
  58. of arctan(-1), -0.7853983, gives the answer -pi/4.  Arcsin -1 returns
  59. -pi/2.  You need not struggle with tables.
  60.      Note that the program always places the square root in the
  61. numerator.  Therefore, 1 divided by the square root of 3 will appear
  62. as SQR 3/3.  To eliminate this, simply add:
  63.  
  64. 125 B=INT(B):IF SQR(B)=H/A THEN L$=K$:K$="":A=A*B:B=1
  65.  
  66. Program Three:
  67.  
  68. 10 K$="":L$="":INPUT H:A=H:GOSUB 100
  69. 20 K$="sqr 2":A=H/SQR(2):GOSUB 100
  70. 30 K$="sqr 3":A=H/SQR(3):GOSUB 100
  71. 40 K$="sqr 5":A=H/SQR(5):GOSUB 100
  72. 45 PI=3.141592653589793#
  73. 50 K$="PI":A=H/PI:GOSUB 100
  74. 60 K$="PI exp 2":A=H/PI/PI:GOSUB 100
  75. 70 K$="":L$="PI":A=H*PI*PI:GOSUB 100
  76. 100 C=ABS(A):B=1
  77. 110 B=BC:C=(1/C)-INT(1/C):IF B>10000 THEN RETURN
  78. 120 IF C>0.00001 THEN 110
  79. 130 B=INT(B):PRINT A*B;K$;"/";B;L$:END
  80.  
  81. -----------------------------------------------------------------
  82.                           Turbo Primes
  83.               (PC World August 1986 Star-Dot-Star)
  84.  
  85.      PRIMES.BAS (PC World Nov 1985 *.*) ran faster than the routine
  86. used in the PC AT speed trials in "AT: The PC's Powerful Partner"
  87. (PC World Vol 2 No 13).  PRIMES2.BAS is faster still.  It finds all
  88. primes less than 1000 in just 14 seconds.  For numbers above 1000,
  89. the speed difference is even more pronounced.
  90.      PRIMES2.BAS maintains an array of markers, one for each number
  91. in the range to be calculated.  Once each number is evaluated, the
  92. program steps through the array by multiples of that number and marks
  93. each of those array positions with a 1.  Next, the program increases
  94. the value to be tested by 1 and checks the array to see if that value's
  95. position has been marked.  If it has not, the value is displayed on
  96. screen, and its multiples in the array are marked.  This process
  97. continues until all values in the range have been tested.  Note that
  98. PRIMES2.BAS will run even faster if you delete line 150.
  99.  
  100. 10 'PRIMES2.BAS
  101. 100 CLS:KEY OFF:DEFINT A-Z
  102. 110 INPUT "Primes up to: ",N
  103. 120 CLS:DIM M(N):T1$=TIME$:PU$=STRING$(LEN(STR$(N)),"#")
  104. 130 FOR C=2 TO N
  105. 140 IF M(C) THEN 190
  106. 150 PRINT USING PU$;C;
  107. 160 FOR L=C*2 TO N STEP C
  108. 170 M(L)=1
  109. 180 NEXT
  110. 190 NEXT
  111. 200 T2$=TIME$:PRINT:PRINT
  112. 210 T1=3600*VAL(MID$(T1$,1,2))+60*VAL(MID$(T1$,4,2))+VAL(MID$(T1$,7,2))
  113. 220 T2=3600*VAL(MID$(T2$,1,2))+60*VAL(MID$(T2$,4,2))+VAL(MID$(T2$,7,2))
  114. 230 PRINT "Calculation took";T2-T1;"seconds."
  115. 240 END
  116.  
  117.